﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace wrzy
{
    public partial class PCI2312
    {

        //***********************************************************
        // CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
        //***********************************************************
        // CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
        //***********************************************************
        // CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
        public Int32 PCI2312_modeRead = 0x0000;   // 只读文件方式
        public Int32 PCI2312_modeWrite = 0x0001;   // 只写文件方式
        public Int32 PCI2312_modeReadWrite = 0x0002;   // 既读又写文件方式
        public Int32 PCI2312_modeCreate = 0x1000;   // 如果文件不存可以创建该文件，如果存在，则重建此文件，并清0



        //################### 常规通用函数(上层底层用户接口)####################
        // 适用于本设备的最基本操作
        [DllImport("PCI2312.DLL")]
        public static extern IntPtr PCI2312_CreateDevice(Int32 DeviceID);  // 创建设备对象
        [DllImport("PCI2312.DLL")]
        public static extern Int32 PCI2312_GetDeviceCount(IntPtr hDevice); // 取得设备总台数
        [DllImport("PCI2312.DLL")]
        public static extern Int32 PCI2312_GetDeviceCurrentID(IntPtr hDevice); // 取得当前设备相应的ID号
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_ListDeviceDlg(IntPtr hDevice); // 列表系统当中的所有的该PCI设备
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_ReleaseDevice(IntPtr hDevice); // 关闭设备,禁止传输,且释放资源

        //####################### 数字I/O输入输出函数 #################################
        // 用户可以使用WritePortULong和ReadPortULong等函数直接控制寄存器进行I/O
        // 输入输出，但使用下面两个函数更省事，它不需要您关心寄存器分配和位操作等，而只
        // 需象VB等语言的属性操作那么简单地实现各开关量通道的控制
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_SetDeviceDO(             // 输出开关量状态
                                            IntPtr hDevice,     // 设备句柄								        
                                            Byte[] bDOSts);  // 开关状态
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_GetDeviceDI(             // 取得开关量状态     
                                            IntPtr hDevice,     // 设备句柄								        
                                            Byte[] bDISts);  // 开关状态										


        //####################### 外触发中断函数 #################################
        // 它由外界硬件信号DI0的状态变化引起CPU产生中断事件hEventInt。
        // 注意：DI0可由其板上跨接套XF1指定为上升沿还是下降沿产生中断
        // 2-3:下降沿， 1-2:为上升沿
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_InitDeviceInt(IntPtr hDevice, IntPtr hEventInt); // 初始化中断
        [DllImport("PCI2312.DLL")]
        public static extern Int32 PCI2312_GetDeviceIntCount(IntPtr hDevice);  // 在中断初始化后，用它取得中断服务程序产生的次数
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_ReleaseDeviceInt(IntPtr hDevice); // 释放中断资源

        //############### I/O端口直接操作及读写函数(底层用户接口) #####################
        // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
        // 控制对象需要特殊的控制流程和控制效率时，则用户可以使用这些接口予以实现。
        // 但这些函数主要适用于传统设备，如ISA总线、并口、串口等设备
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_GetDeviceAddr( // 取得指定的指定设备ID号的映射寄存器的线性基地址，返回设备总数
                                                    IntPtr hDevice,  // 设备对象句柄
                                                    ref UInt32 LinearAddr, // 返回指定映射寄存器的线性地址
                                                    ref UInt32 PhysAddr,   //  返回指定映射寄存器的物理地址												
                                                    Int32 RegisterID);   // 设备映射寄存器的ID号（0-5）
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_WritePortByte(IntPtr hDevice, UInt32 nPort, Byte Value);
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_WritePortWord(IntPtr hDevice, UInt32 nPort, UInt32 Value);
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_WritePortULong(IntPtr hDevice, UInt32 nPort, UInt32 Value);

        [DllImport("PCI2312.DLL")]
        public static extern Byte PCI2312_ReadPortByte(IntPtr hDevice, UInt32 nPort);
        [DllImport("PCI2312.DLL")]
        public static extern UInt32 PCI2312_ReadPortWord(IntPtr hDevice, UInt32 nPort);
        [DllImport("PCI2312.DLL")]
        public static extern UInt32 PCI2312_ReadPortULong(IntPtr hDevice, UInt32 nPort);

        //########################### 文件操作函数 #####################################
        [DllImport("PCI2312.DLL")]
        public static extern IntPtr PCI2312_CreateFileObject(                    // 初始文件系统
                                              IntPtr hDevice,     // 设备对象
                                              ref String szNewFileName,  // 新文件名
                                              Int32 Mode);		 // 文件操作方式

        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_WriteFile(      // 保存用户空间中数据
                                            IntPtr hFileObject,  // 设备对象
                                            ref Int16 pDataBuffer, // 用户数据空间地址
                                            UInt32 nWriteSizeBytes); // 缓冲区大小(字节)

        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_ReadFile(  // 读数据
                                              IntPtr hFileObject,     // 设备对象
                                              ref Int16 pDataBuffer, // 接受文件数据的用户内存缓冲区
                                              UInt32 OffsetBytes,   // 从文件前端开始的偏移位置
                                              UInt32 nReadSizeBytes); // 从偏移位置开始读的字节数

        [DllImport("PCI2312.DLL")]
        public static extern UInt32 PCI2312_GetFileLength(IntPtr hFileObject); // 取得指定文件长度（字节）
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_SetFileOffset( // 设置文件偏移指针
                                              IntPtr hFileObject,   // 文件对象
                                              UInt32 nOffsetBytes);  // 文件偏移位置（以字为单位）

        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_ReleaseFile(IntPtr hFileObject);
        [DllImport("PCI2312.DLL")]
        public static extern UInt64 PCI2312_GetDiskFreeBytes(               // 获得指定盘符的磁盘空间
                                          ref String szDiskName);            // 盘符名,如C盘为"C:\\", D盘为"D:\\"

        //################# 线程操作函数 ########################
        [DllImport("PCI2312.DLL")]
        public static extern IntPtr PCI2312_CreateSystemEvent(); // 创建内核事件对象
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_ReleaseSystemEvent(IntPtr hEvent); // 释放内核事件对象
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_CreateVBThread(ref IntPtr hThread, Int32 StartThread);
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_TerminateVBThread(IntPtr hThreadHandle);
        [DllImport("PCI2312.DLL")]
        public static extern Boolean PCI2312_DelayTime(IntPtr hDevice, Int32 nTime);
    }
}
